#pragma once




namespace boostext
{
	/**
	 * This checks if a value (that is, if it provides the %-operator) is even and returns true,
	 * otherwise false.
	 */
	struct even
	{
		template <typename T>
		bool operator()(const T& n)const
		{
			return n % 2 == 0;
		}
	};
	///////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * This checks if a value (that is, if it provides the %-operator) is uneven and returns true,
	 * otherwise false.
	 */
	struct uneven
	{
		template <typename T>
		bool operator()(const T& n)const
		{
			return n % 2 != 0;
		}
	};
	///////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * This checks if a value (that is, if it provides the >=-operator) is positive and returns true,
	 * otherwise false.
	 */
	struct positive
	{
		template <typename T>
		bool operator()(const T& n) const
		{
			return n >= T(0);
		}
	};
	///////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * This checks if a value (that is, if it provides the <-operator) is positive and returns true,
	 * otherwise false.
	 */
	struct negative
	{
		template <typename T>
		bool operator()(const T& n) const
		{
			return n < T(0);
		}
	};
	///////////////////////////////////////////////////////////////////////////////////////////////

	struct prime
	{
		template <typename T>
		bool operator()(T n) const
		{
			if(n % 2 == 0)
				return false;

			T half;
			if(n < 0) half = -n / 2;
			else      half = n / 2;

			for(T i = 3; i < half; i += 2)
			{
				if(n % i == 0)
					return false;
			}

			return true;
		}
	};
	///////////////////////////////////////////////////////////////////////////////////////////////
}
///////////////////////////////////////////////////////////////////////////////////////////////////
